Matching the bouy data to the other data collected

hilo <- hbb_wku_h_xts
hilo <- data.frame(date=index(hilo), coredata(hilo))
hilo <- hilo[529:54816,]
hilo
# which(hilo$date=="2010-10-23 00:00:00") = index 529 

# which(hilo$date=="2016-12-31 23:00:00") = index 54816
length(hilo[,1]) # we are left with 54288 lines of data
[1] 54288
54816 - length(hilo[,1]) # we lost 528 values 
[1] 528

Changing column names

# removing columns that we are not using 
hilo$date.2 <- NULL # another date column
hilo$date.1 <- NULL # another date column
hilo$BGARFU <- NULL # ?
hilo$cfs <- NULL
hilo$DOmgL <- NULL # dissolved oxygen
#hilo$Doper <- NULL # dissolved oxygen
hilo$PAR1 <- NULL # ?
hilo$pH <- NULL # pH
hilo$NTU <- NULL # a different measurement for turbitity
hilo$DOper10 <- NULL # dissolved oxygen

# colnames(hilo) <- c("Date", "cfs", "RiverFlow-cumec", "LogRiverFlow-cumec", "Chlorophyll-RFU", "Salinity-PPT", "Temp-C", "chlorophyll-calibrator", "Turbidity-NTU")
# does not work ???

hilo

====================================================

FULL DATA SET 2012-2016

Descriptives: PLots

River Flow FULL DATA SET

length(hilo$logcms[which(is.na(hilo$logcms)==TRUE)]) # 12 NAs 
[1] 12
which(is.na(hilo$logcms)==TRUE)
 [1] 50509 50510 50511 50512 50513 50514 50515 50516 50517 50518
[11] 50519 50520
RiverFlow <- ggplot(hilo,  aes(x = date, y = as.numeric(cms))) + 
  geom_line()

print(RiverFlow + ggtitle("River Flow")+labs(x="Time", y = "River Flow - cubic meters per second"))

CHL FULL DATA SET

length(hilo$ChlRFU[which(is.na(hilo$ChlRFU)==TRUE)]) # 20464 NAs
[1] 20464
which(as.numeric(hilo$ChlRFU)==max(as.numeric(na.omit(hilo$ChlRFU)))) # 15.3 max 
[1] 38974
# CHL tells us where in the data set this happened  
hilo[38974,]

CHL <- ggplot(hilo,  aes(x = date, y = as.numeric(ChlRFU))) + 
  geom_line()

print(CHL + ggtitle("Chlorophyll ")+labs(x="Time", y = "Chlorophyll  - relative fluorescence units (RFU)"))

Turbity FULL DATA SET

length(hilo$Corr.NTU[which(is.na(hilo$Corr.NTU)==TRUE)]) #15012 NAs
[1] 15012
which(as.numeric(hilo$Corr.NTU)==max(as.numeric(na.omit(hilo$Corr.NTU)))) # 88.4
[1] 33243
# tells us where in the data set this happened
hilo[33243,]

TURB <- ggplot(hilo,aes(x = date, y = as.numeric(Corr.NTU))) + 
  geom_line()

print(TURB + ggtitle("Turbidity ")+labs(x="Time", y = "Turbidity - Nephelometric Turbidity Units (NTU)"))

Salinity FULL DATA SET

length(hilo$saltppt[which(is.na(hilo$saltppt)==TRUE)]) #11330 NAs
[1] 11330
SALT <- ggplot(hilo,  aes(x = date, y = as.numeric(saltppt))) + 
  geom_line()

print(SALT + ggtitle("Salinity")+labs(x="Time", y = "Salinity - unit parts per thousand (PPT)"))

======================================================== # Histograms FULL DATA SET ## River Flow Histogram

hist(as.numeric(hilo$logcms), main = "Histogram of Log River Flow", xlab = "Log River Flow")


# this looks okay

CHL Histogram

# VERY skewed
hist(as.numeric(hilo$ChlRFU), main = "Histogram of Chlorophyll", xlab = "Chlorophyll  - relative fluorescence units (RFU)")


# this looks better
hist(log(as.numeric(hilo$ChlRFU)), main = "Histogram of Log Chlorophyll", xlab = "Chlorophyll")
NaNs produced

# not sure what happens to units when taking the log 

Turbity Histogram

# VERY skewed
hist(as.numeric(hilo$Corr.NTU), main = "Histogram of Turbidity", xlab = "Turbidity - Nephelometric Turbidity Units (NTU)")


# this looks better
hist(log(as.numeric(hilo$Corr.NTU)), main = "Histogram of Log Turbidity", xlab = "Turbidity")

# not sure what happens to units when taking the log 

Salinity Histogram

# skewed
hist(as.numeric(hilo$saltppt), main = "Histogram of Salinity", xlab = "Salinity - unit parts per thousand (PPT)")


# this is worst!
hist(log(as.numeric(hilo$saltppt)), main = "Histogram of Log Salinity", xlab = "Salinity")

# not sure what happens to units when taking the log 

========================================================= # NEW DATA SET-Modified Data 2013-2015

# start date: 2013-01-01 00:00:00
# end date: 2015-12-31 23:00:00
hilomodified <- hilo[19225:45504,]
length(hilo[,1])-length(hilomodified[,1])
[1] 28008
# lost 28008 entries of data 

length(hilomodified[,1])-528 # we are left with 25752 entries of data 
[1] 25752
head(hilomodified)
tail(hilomodified)
NA

Descriptives on all variables MODIFIED DATA SET: Using Favstats

River Flow Favstats

library(mosaic)
favstats(hilomodified$cms)
Auto-converting character to numeric.

CHL Favstats

favstats(hilomodified$ChlRFU)
Auto-converting character to numeric.

Turbitity Favstats

favstats(hilomodified$Corr.NTU)
Auto-converting character to numeric.

Salinity Favstats

favstats(hilomodified$saltppt)
Auto-converting character to numeric.
favstats(hilomodified$TempC)
Auto-converting character to numeric.
favstats(hilomodified$Doper)
Auto-converting character to numeric.

===================================================== # MODIFIED DATA SET 2013-2015 # Descriptives: Plots

River Flow MODIFIED

length(hilomodified$logcms[which(is.na(hilomodified$logcms)==TRUE)]) # No NAs, YAY!
[1] 0
which(is.na(hilomodified$logcms)==TRUE)
integer(0)
RiverFlowMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(cms))) + 
  geom_line()

print(RiverFlowMod + ggtitle("River Flow")+labs(x="Time", y = "River Flow - cubic meters per second"))

CHL MODIFIED

sum(is.na(hilomodified$ChlRFU)==TRUE) # 1884 NAs
[1] 1884
#which(is.na(hilomodified$ChlRFU)==TRUE)
# max(as.numeric(na.omit(hilo$ChlRFU))) # 15.3
which(as.numeric(hilomodified$ChlRFU)==15.3)
[1] 19750
hilo[38974,]

CHLMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(ChlRFU))) + 
  geom_line()

print(CHLMod + ggtitle("Chlorophyll ")+labs(x="Time", y = "Chlorophyll  - relative fluorescence units (RFU)"))

Turbitity MODIFIED

length(hilomodified$Corr.NTU[which(is.na(hilomodified$Corr.NTU)==TRUE)]) # 2704 NAs
[1] 2704
# max(as.numeric(na.omit(hilo$Corr.NTU))) # 88.4
which(as.numeric(hilo$Corr.NTU)==88.4)
[1] 33243
hilo[33243,]

TURBMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(Corr.NTU))) + 
  geom_line()

print(TURBMod + ggtitle("Turbidity ")+labs(x="Time", y = "Turbidity - Nephelometric Turbidity Units (NTU)"))

Salinity MODIFIED

length(hilomodified$saltppt[which(is.na(hilomodified$saltppt)==TRUE)]) # 2267 NAs
[1] 2267
SALTMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(saltppt))) + 
  geom_line()

print(SALTMod + ggtitle("Salinity")+labs(x="Time", y = "Salinity - unit parts per thousand (PPT)"))

Tempurature MODIFIED

length(hilomodified$TempC[which(is.na(hilomodified$TempC)==TRUE)]) # 2267 NAs
[1] 1702
TempMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(TempC))) + 
  geom_line()

print(TempMod + ggtitle("Temperature")+labs(x="Time", y = "Temperature - Celsius"))

Dissolved Oxygen MODIFIED

length(hilomodified$Doper[which(is.na(hilomodified$Doper)==TRUE)]) # 2267 NAs

TempMod <- ggplot(hilomodified,  aes(x = date, y = as.numeric(Doper))) + 
  geom_line()

print(TempMod + ggtitle("Dissolved Oxygen")+labs(x="Time", y = "Dissolved Oxygen in percent of saturation"))

=================================================== # Histograms MODIFIED

River Flow MODIFIED

hist(as.numeric(hilomodified$cms), main = "Histogram of Log River Flow", xlab = "Log River Flow", breaks =90, xlim = c(0,100))


# this looks okay

CHL MODIFIED

# VERY skewed
hist(as.numeric(hilomodified$ChlRFU), main = "Histogram of Chlorophyll", xlab = "Chlorophyll  - relative fluorescence units (RFU)")


# this looks better
hist(log(as.numeric(hilomodified$ChlRFU)), main = "Histogram of Log Chlorophyll", xlab = "Chlorophyll")
NaNs produced

# not sure what happens to units when taking the log 

Turbitity MODIFIED

# VERY skewed
hist(as.numeric(hilomodified$Corr.NTU), main = "Histogram of Turbidity", xlab = "Turbidity - Nephelometric Turbidity Units (NTU)")


# this looks better
hist(log(as.numeric(hilomodified$Corr.NTU)), main = "Histogram of Log Turbidity", xlab = "Turbidity")

# not sure what happens to units when taking the log 

Salinity MODIFIED

# skewed
hist(as.numeric(hilomodified$saltppt), main = "Histogram of Salinity", xlab = "Salinity - unit parts per thousand (PPT)")

# this is worst!
hist(log(as.numeric(hilomodified$saltppt)), main = "Histogram of Log Salinity", xlab = "Salinity")
# not sure what happens to units when taking the log 

=============================================================

Plot with ALL Var 2013-2015

It is hard to see what is going on

AllYears <- ggplot(hilomodified,  aes(x = date, y = as.numeric(logcms))) + 
  geom_line()+
  geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
  geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="blue")

print(AllYears + ggtitle("Hilo Bay")+labs(x="Time", y = "River Flow - cubic meters per second"))

============================================================== # Descriptives by Storm We are picking one storm from each year. We can indicate a storm has occurred by the extreme events in the river flow data. We will not use the log (which is logbase10) in order to see the extreme events When salinity is below 35 this also indicates a storm has occurred.

We will break the data set by year to find the most extreme event for each year.

hilo2013 <- hilomodified[1:8760,]

hilo2014 <- hilomodified[8761:17520,]

hilo2015 <- hilomodified[17521:length(hilomodified[,1]),]

2013 Data & Plot

# max(as.numeric(hilo2013$logcms)) # this is log base 10 
# This is NOT the natural log
max(as.numeric(hilo2013$cms)) # 207.186 
[1] 207.186
which(as.numeric(hilo2013$cms) == max(as.numeric(hilo2013$cms)))
[1] 3550
hilo2013[3550,]
# all values for this storm are NA

plot2013 <- ggplot(hilo2013,  aes(x = date, y = as.numeric(cms))) + 
  geom_line(color="black")+
  geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
  geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="blue")

print(plot2013 + ggtitle("2013")+labs(x="Time", y = "River Flow - cubic meters per second"))

Split 2013 into 6 months to get a better visual

# R2013.1 <- ggplot(hilo2013[1:(length(hilo2013[,1])/2),],  aes(x = date, y = as.numeric(cms))) + 
#   geom_line(color="black")+
#   geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
#   geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
#   geom_line(aes(y=as.numeric(ChlRFU)),color="blue")
# print(R2013.1 + ggtitle("River Flow")+labs(x="Time", y = "River Flow - cubic meters per second"))
# R2013.1+ylim(0,40)
# 
# 
# R2013.2 <- ggplot(hilo2013[(length(hilo2013[,1])/2):length(hilo2013[,1]),],  aes(x = date, y = as.numeric(cms))) + 
#   geom_line(color="black")+
#   geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
#   geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
#   geom_line(aes(y=as.numeric(ChlRFU)),color="blue")
# print(R2013.2 + ggtitle("River Flow")+labs(x="Time", y = "River Flow - cubic meters per second"))
# R2013.2+ylim(0,40)

2014 Data & Plot

# Max river flow in the overall data set
max(as.numeric(hilo2014$cms))
[1] 472.4939
max(as.numeric(hilomodified$cms))
[1] 472.4939
which(as.numeric(hilo2014$cms) == max(as.numeric(hilo2014$cms)))
[1] 5263
hilo2014[5263,]

R2014 <- ggplot(hilo2014,  aes(x = date, y = as.numeric(logcms))) + 
  geom_line(color="black")+
  geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
  geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="blue")

print(R2014 + ggtitle("2014")+labs(x="Time", y = "River Flow - cubic meters per second"))

2015 Data & Plot

max(as.numeric(hilo2015$cms))
[1] 232.2449
which(as.numeric(hilo2015$cms) == max(as.numeric(hilo2015$cms)))
[1] 6475
hilo2015[6475,]

R2015 <- ggplot(hilo2015,  aes(x = date, y = as.numeric(logcms))) + 
  geom_line(color="black")+
  geom_line(aes(y = as.numeric(saltppt)), color = "darkred") +
  geom_line(aes(y = as.numeric(Corr.NTU)), color="darkgreen") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="blue")

print(R2015 + ggtitle("2015")+labs(x="Time", y = "River Flow - cubic meters per second"))

# Separating the Data by Storm Events

Separating the Data by Storm

outcomes <- as.numeric(hilomodified$saltppt)<25 
index.lt25 <- which(outcomes==TRUE)

poss.storms <- hilomodified[index.lt25,]
poss.storms
outcomes.35 <- as.numeric(hilomodified$saltppt)<35 
index.lt35 <- which(outcomes==TRUE)
index.lt25
   [1]   159   160   161   162   163   164   209   210   213   218
  [11]   225   227   228   230   231   232   234   759   765   766
  [21]   815   816   894   895   899   900   901   902   903   904
  [31]   905   906   907   908  1112  1113  1114  1115  1116  1117
  [41]  1118  1119  1120  1121  1122  1123  1124  1125  1126  1131
  [51]  1132  1133  1134  1135  1136  1137  1138  1139  1140  1141
  [61]  1142  1143  1144  1145  1146  1147  1148  1149  1150  1151
  [71]  1152  1153  1154  1155  1156  1157  1158  1159  1160  1161
  [81]  1162  1163  1164  1165  1166  1167  1168  1169  1170  1171
  [91]  1172  1173  1174  1175  1176  1177  1178  1179  1180  1181
 [101]  1182  1183  1184  1185  1186  1187  1188  1189  1190  1191
 [111]  1192  1193  1194  1195  1196  1197  1198  1200  1201  1202
 [121]  1204  1205  1206  1207  1208  1209  1210  1211  1212  1213
 [131]  1214  1215  1216  1217  1218  1219  1220  1221  1222  1223
 [141]  1224  1225  1226  1227  1228  1229  1230  1231  1232  1233
 [151]  1234  1235  1236  1237  1238  1239  1240  1241  1242  1243
 [161]  1244  1245  1246  1247  1248  1249  1250  1251  1252  1253
 [171]  1254  1255  1256  1257  1258  1259  1260  1261  1262  1263
 [181]  1264  1265  1266  1267  1268  1269  1270  1271  1272  1273
 [191]  1274  1275  1276  1277  1278  1279  1283  1284  1285  1286
 [201]  1288  1289  1293  1294  1295  1296  1297  1298  1299  1300
 [211]  1301  1302  1303  1304  1305  1306  1307  1308  1309  1310
 [221]  1311  1312  1313  1314  1315  1316  1317  1318  1319  1320
 [231]  1321  1322  1323  1324  1325  1326  1327  1328  1329  1330
 [241]  1331  1332  1333  1334  1335  1336  1337  1338  1339  1340
 [251]  1341  1342  1343  1344  1345  1346  1347  1348  1349  1350
 [261]  1351  1352  1353  1354  1355  1356  1357  1358  1359  1360
 [271]  1361  1362  1363  1364  1365  1366  1368  1369  1370  1371
 [281]  1372  1373  1374  1375  1376  1377  1378  1379  1380  1381
 [291]  1382  1383  1384  1391  1392  1393  1410  1411  1413  1414
 [301]  1415  1416  1417  1418  1419  1420  1421  1424  1425  1427
 [311]  1428  1431  1432  1433  1434  1435  1436  1437  1438  1439
 [321]  1440  1442  1443  1444  1445  1446  1447  1450  1451  1452
 [331]  1453  1454  1458  1478  1479  1480  1481  1482  1483  1484
 [341]  1490  1515  2137  3485  3487  3488  3489  3490  3491  3492
 [351]  3495  3496  3497  3498  3499  3500  3501  3502  3503  3508
 [361]  3509  3513  3518  3519  5312  5313  5317  5318  5319  5320
 [371]  5321  5322  5323  5325  5326  5327  5328  5329  5330  5331
 [381]  5332  5334  5335  5336  5337  5338  5339  5340  5341  5342
 [391]  5343  5344  5345  5346  5347  5348  5349  5350  5368  5474
 [401]  5475  5485  5486  5487  5488  5489  5491  5492  5509  5756
 [411]  7545  8672  8673  8674  8675  8676  8677  8678  8679  8680
 [421]  8681  8682  8683  8713  8714  8715  8716  8717  8718  8719
 [431]  8720  8721  8722  8723  8724  8725  8726  8727  8728  8729
 [441]  8730  8731  8732  8733  8734  8735  8736  8737  8738  8739
 [451]  8740  8741  8742  8743  8744  8745  8746  8747  8748  8749
 [461]  8750  8751  8752  8753  8754  8755  8756  8757  8758  8759
 [471]  8760  8761  8762  8763  8764  8765  8766  8767  8768  8769
 [481]  8770  8771  8772  8773  8774  8775  8776  8835  8836  8837
 [491]  8839  8840  8841  8842  8843  8844  8845  8846  8847  8848
 [501]  8849  8855  8856  8857  8858  8859  8862  8863  8864  8865
 [511]  8876  8927  8932  8933  8945 10394 10395 10396 10397 10398
 [521] 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408
 [531] 10410 10411 10413 10414 10421 10422 10425 10427 10428 10429
 [541] 10430 10431 10432 10433 10434 10435 10436 10437 10438 10441
 [551] 10442 10443 10444 10445 10446 10450 10538 10539 10540 10541
 [561] 10544 10545 10546 10547 10552 10553 10554 10555 10556 10557
 [571] 10558 10559 10570 10644 10647 10652 10656 10657 10659 10664
 [581] 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674
 [591] 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684
 [601] 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694
 [611] 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704
 [621] 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714
 [631] 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724
 [641] 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734
 [651] 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744
 [661] 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754
 [671] 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764
 [681] 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774
 [691] 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784
 [701] 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794
 [711] 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804
 [721] 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814
 [731] 10815 10816 10817 10818 10819 10820 10830 10831 10832 10833
 [741] 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928
 [751] 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938
 [761] 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948
 [771] 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958
 [781] 10959 10960 10964 10965 10966 10967 10968 10969 10970 10971
 [791] 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981
 [801] 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991
 [811] 10992 10993 10994 10995 10997 10998 11000 11001 11002 11003
 [821] 11004 11005 11006 11007 11008 11009 11010 11011 11012 11019
 [831] 11020 11021 11022 11023 11024 11025 11026 11027 11028 11030
 [841] 11031 11032 11033 11065 11077 11086 11093 11094 11095 11096
 [851] 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106
 [861] 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116
 [871] 11117 11118 11119 11120 11122 11123 11124 11125 11126 11127
 [881] 11128 11129 11130 11131 11132 11133 11134 11135 11136 11139
 [891] 11140 11149 11150 11151 11204 11205 11210 11211 11212 11213
 [901] 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223
 [911] 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233
 [921] 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243
 [931] 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253
 [941] 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263
 [951] 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273
 [961] 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283
 [971] 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293
 [981] 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303
 [991] 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313
 [ reached getOption("max.print") -- omitted 2851 entries ]
poss.storms35 <- hilomodified[index.lt25,]
poss.storms35

hilomodified$date[16]
[1] "2013-01-01 15:00:00 UTC"
storm.1.7.13 <- ggplot(hilomodified[145:168,],  aes(x = date, y = as.numeric(cms))) + 
  geom_line(color="black")+
  geom_line(aes(y = as.numeric(saltppt)), color = "lightsteelblue1") +
  geom_line(aes(y = as.numeric(Corr.NTU)), color="grey69") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="khaki")

print(storm.1.7.13 + ggtitle("Storm 1/7/13")+labs(x="Time"))

Trying to make the Rainfall plot easier to read

RiverFlow1 <- ggplot(hilomodified[1:100,],  aes(x = date, y = as.numeric(cms))) + 
  geom_line()

print(RiverFlow + ggtitle("River Flow")+labs(x="Time", y = "River Flow - cubic meters per second"))

=======

getwd()
[1] "/Users/odalysbar/Documents/MA321-SP21/HiloBay-Adolf/HiloBay_MA321_Spring21"
# write.csv(hilomodified,file="HiloBayNEW13to15.csv", row.names = FALSE)

NEW Change in River Flow Column

pos.neg <- as.numeric(hilomodified$cms) - 10

start <- vector()
end <- vector()

for(i in 1:length(pos.neg)){
  if(isTRUE(pos.neg[i] < 0 && pos.neg[i+1] > 0)){
    start[i] <- i
  }else if(isTRUE(pos.neg[i] > 0 && pos.neg[i+1] < 0)){
    end[i] <- i
    }
}
start<-start[!is.na(start)]
start
 [1]   141   212   891  1097  1106  3480  3499  3545  5309  7537
[11]  8713  8729 10388 10390 10411 10727 10737 10843 10917 11216
[21] 11340 11508 11646 12581 13406 13458 13551 13655 13866 14010
[31] 15233 15287 15722 16054 16727 19777 19802 19920 20066 20386
[41] 20622 20662 21143 21163 22249 22656 22762 22911 23008 23015
[51] 23060 23116 23201 23395 23640 23703 23740 23757 23774 23807
[61] 23947 24141 24312 24437 24938 25005 25246 25474 25492 25972
[71] 26107 26187
length(start)
[1] 72
end<-end[!is.na(end)]
end
 [1]   162   226   903  1102  1398  3495  3500  3572  5338  7547
[11]  8718  8765 10389 10404 10412 10732 10752 10845 11044 11232
[21] 11346 11525 11695 12596 13445 13514 13648 13670 13888 14111
[31] 15235 15288 15750 16148 16749 19790 19811 19938 20087 20394
[41] 20650 20719 21153 21169 22257 22675 22771 22972 23013 23020
[51] 23070 23130 23215 23403 23670 23719 23742 23761 23781 23899
[61] 24082 24168 24325 24510 24945 25233 25328 25482 25499 26093
[71] 26117 26214
length(end)
[1] 72
for(i in 1:length(start)){
  storm <- ggplot(hilomodified[(start[i]-24):(end[i]+24),],  aes(x = date, y = as.numeric(cms))) +
  geom_line(color="black")+
  geom_line(aes(y = as.numeric(Corr.NTU)), color="grey69") +
  geom_line(aes(y=as.numeric(ChlRFU)),color="khaki")

print(storm + ggtitle("Storm 1/7/13")+labs(x="Time"))
}

ChangeRF <- function(x = vector()){
change <- c(0)
  for(i in 1:(length(x)-1)){
    change[i+1] <- x[i]-x[i+1]
  }
  return(change)
}
change.vector <- c(ChangeRF(as.numeric(hilomodified$cms)))
change.vector
   [1]   0.00000   0.02124   0.02832   0.02124   0.02832   0.00708
   [7]   0.00000   0.02124   0.02124   0.02832   0.01416   0.00000
  [13]   0.00708   0.00708   0.01416   0.02124   0.00708   0.00708
  [19]   0.01416   0.03540   0.00000   0.01416   0.00000   0.02832
  [25]   0.02124   0.02124   0.00000   0.01416   0.01416   0.00000
  [31]   0.00000   0.00000   0.02832  -0.00708   0.02124   0.00000
  [37]   0.01416   0.02124   0.00000   0.02124   0.01416   0.00000
  [43]   0.00000   0.00708   0.00708   0.00708   0.02832   0.00708
  [49]   0.00708   0.01416   0.00000   0.00708   0.00000   0.00000
  [55]   0.02124   0.00000   0.01416   0.02124  -0.01416   0.01416
  [61]   0.00000   0.00000   0.00708   0.02124   0.00708   0.00708
  [67]   0.01416   0.00000   0.00000   0.00708   0.02832   0.00708
  [73]   0.00708   0.00708   0.01416   0.00000   0.00000  -0.01416
  [79]   0.01416   0.01416   0.00000   0.00000   0.00000   0.00000
  [85]   0.00000  -0.00708  -0.02832  -0.04248  -0.00708   0.00000
  [91]  -0.02124  -0.02832  -0.04248  -0.02124  -0.01416  -0.02124
  [97]  -0.02124   0.01416   0.03540   0.00708   0.00000   0.00708
 [103]   0.00708  -0.19116  -0.25488  -0.29028  -0.16284   0.09204
 [109]  -0.33984  -0.44604   0.04956   0.16284   0.12036  -0.11328
 [115]  -0.22656  -0.27612  -0.31152  -1.13988  -1.58592   0.59472
 [121]   0.67968   0.49560   0.14160   0.00708   0.21948   0.04248
 [127]  -0.41064  -0.95580  -0.45312   0.32568   0.53100   0.54516
 [133]   0.56640   0.32568   0.29736   0.06372  -0.45312  -0.82836
 [139]  -0.63720  -1.22484  -1.92576  -2.30100  -2.73996  -1.72044
 [145]  -0.54516  -0.25488  -0.09912  -0.43896  -1.32396  -1.54344
 [151]  -1.43724  -1.09032  -0.55224  -0.10620   0.44604   0.92748
 [157]   1.83372   2.47092   2.03196   1.81248   1.60008   1.35228
 [163]   1.06908   0.86376   0.75756   0.66552   0.54516   0.43188
 [169]   0.43896   0.31860   0.26196   0.24780   0.19116   0.16992
 [175]   0.09912   0.13452   0.04956   0.09912   0.02124   0.04956
 [181]   0.02832   0.03540   0.00000   0.05664   0.02124   0.02832
 [187]   0.02832   0.04248  -0.00708   0.00708  -0.07788  -0.12036
 [193]  -0.04956  -0.16284  -0.12036  -0.21240  -0.20532  -0.25488
 [199]  -0.80004   0.01416   0.05664  -0.24780  -0.41064   0.06372
 [205]   0.24780   0.27612   0.22656   0.24780   0.12036   0.02832
 [211]  -0.35400  -1.84080  -5.09760  -6.35784 -10.52088  -4.71528
 [217]   3.39840   4.29756   3.27096   2.61252   2.20188   1.98948
 [223]   1.67088   1.46556   1.35228   1.20360   1.00536   0.80004
 [229]   0.75048   0.56640   0.51684   0.40356   0.40356   0.34692
 [235]   0.24780   0.02124   0.00708   0.14868   0.10620   0.19116
 [241]   0.14160   0.12036   0.11328   0.09204   0.05664   0.03540
 [247]   0.05664   0.02124   0.06372   0.07080   0.02124   0.02832
 [253]   0.04956   0.03540   0.04956   0.02124   0.01416   0.04956
 [259]   0.04248   0.04248   0.02124   0.04956   0.01416   0.03540
 [265]   0.02832   0.04248   0.03540   0.02124   0.04956   0.03540
 [271]   0.00708   0.05664   0.04248   0.02832   0.03540   0.03540
 [277]   0.04248   0.02832   0.02124   0.02832   0.03540   0.03540
 [283]   0.03540   0.02124   0.05664   0.01416  -0.04956  -0.18408
 [289]   0.14160   0.07788  -0.04956  -0.09912  -0.19824  -0.23364
 [295]  -0.36108  -0.16284   0.06372   0.14868   0.19116   0.18408
 [301]   0.14868   0.11328   0.08496   0.05664   0.07080   0.04248
 [307]   0.02832   0.02832   0.02832   0.05664   0.02832   0.00708
 [313]   0.04248   0.00708   0.02124   0.02832   0.02832   0.02832
 [319]   0.01416   0.02832   0.01416   0.01416   0.01416   0.02832
 [325]   0.01416   0.02124   0.01416   0.00708   0.00000   0.03540
 [331]   0.01416   0.02124   0.02124   0.01416   0.00708   0.01416
 [337]   0.00708   0.02832   0.01416   0.02124   0.00000   0.00708
 [343]   0.00000   0.02832   0.01416   0.02124  -0.00708   0.02832
 [349]  -0.00708   0.02124   0.00708   0.00000   0.00000   0.02124
 [355]   0.00708   0.00708   0.01416   0.00708   0.00708   0.02124
 [361]   0.00708   0.03540   0.00000   0.00708   0.02124   0.01416
 [367]   0.00000   0.02124   0.01416   0.00708   0.01416   0.00000
 [373]   0.02832  -0.02124   0.01416   0.00708  -0.01416   0.00708
 [379]   0.02124   0.00000   0.01416   0.00000   0.00708  -0.00708
 [385]   0.02124   0.01416   0.02124   0.00708   0.00708   0.01416
 [391]   0.00000   0.02124   0.00000   0.00708   0.00000   0.02124
 [397]  -0.01416   0.02124   0.00708   0.01416   0.00708   0.01416
 [403]   0.00000   0.01416   0.00000   0.00000   0.02124   0.00708
 [409]   0.00000   0.00708   0.00708   0.01416   0.00000   0.00000
 [415]   0.00000   0.02124  -0.01416   0.02832   0.00000   0.01416
 [421]   0.00708   0.00000   0.00000   0.00000   0.00000   0.00708
 [427]   0.01416   0.01416   0.00708   0.01416   0.01416   0.00708
 [433]  -0.00708   0.01416   0.00000   0.00000   0.00708   0.01416
 [439]  -0.07080  -0.56640   0.01416   0.21948   0.16284   0.10620
 [445]   0.05664   0.04956   0.02124   0.01416   0.01416   0.02124
 [451]   0.01416   0.00708   0.00000   0.00708   0.00708   0.01416
 [457]   0.02124   0.00000   0.00708   0.00000   0.00000   0.00000
 [463]   0.00000   0.01416   0.00708   0.00708   0.00000   0.00000
 [469]   0.00000   0.00000   0.00000   0.00708   0.01416   0.00708
 [475]   0.00708   0.00708   0.01416   0.00000   0.00000   0.00000
 [481]   0.00000   0.00708   0.00708   0.01416   0.00000   0.00000
 [487]   0.00000   0.00000   0.00000   0.01416   0.00000   0.01416
 [493]   0.00000   0.00000   0.01416   0.00708   0.00708   0.00000
 [499]   0.00000   0.00000   0.00000   0.00000   0.01416   0.00708
 [505]   0.00708   0.00000   0.00000   0.00000   0.00000   0.00000
 [511]   0.00000   0.00000   0.00708   0.01416   0.00000   0.00000
 [517]   0.00708   0.00000   0.00000   0.00000   0.00000   0.00000
 [523]   0.01416   0.01416   0.00000   0.00000   0.00000   0.00000
 [529]   0.00000   0.00000   0.00000   0.00708   0.00000   0.00708
 [535]   0.00708   0.00000   0.00000   0.00708   0.00000   0.00000
 [541]   0.00000   0.00000  -0.00708   0.00708   0.00000   0.00000
 [547]   0.00000   0.00000   0.01416   0.01416  -0.01416   0.00708
 [553]   0.00000  -0.01416   0.00708   0.00000  -0.01416   0.00000
 [559]  -0.02124  -0.00708   0.00000   0.00000   0.00000   0.00000
 [565]   0.00000   0.00000   0.00000   0.02832   0.00000   0.00000
 [571]   0.02124   0.00708   0.00000   0.00708  -0.00708   0.00000
 [577]   0.01416  -0.00708  -0.01416  -0.02124  -0.00708  -0.01416
 [583]  -0.00708   0.00000  -0.02124  -0.00708   0.00000   0.00000
 [589]   0.00000   0.00708   0.01416   0.00708   0.01416   0.01416
 [595]   0.00708   0.02124   0.00000   0.00000   0.00708   0.02124
 [601]   0.00000   0.00000   0.00708   0.00708   0.01416   0.00000
 [607]   0.00000   0.00000   0.00000   0.00000   0.00000   0.01416
 [613]   0.01416   0.00000   0.00000   0.00000   0.00000   0.00000
 [619]   0.00000   0.00708   0.00708   0.01416   0.00000   0.00000
 [625]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [631]   0.00000   0.00000   0.00000   0.00000   0.00708  -0.00708
 [637]   0.02832  -0.00708   0.00708   0.00000   0.00000   0.00000
 [643]   0.00000   0.00000   0.00708  -0.00708   0.00000   0.00708
 [649]   0.00708   0.01416  -0.00708   0.00708   0.00000   0.00000
 [655]   0.00000   0.00000  -0.07080  -0.14868   0.00000   0.04248
 [661]   0.04956   0.04248   0.02832   0.02124   0.00708   0.02124
 [667]   0.00708   0.00000   0.00000   0.01416   0.00708   0.00708
 [673]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [679]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [685]   0.00000   0.00000   0.00000   0.00000  -0.04956  -0.08496
 [691]  -0.33984  -0.17700   0.19824   0.13452   0.06372   0.02832
 [697]   0.02832   0.02832   0.02832   0.02124   0.02124   0.01416
 [703]   0.02124   0.00708   0.00000   0.00708   0.02124   0.00000
 [709]   0.00000   0.00708   0.00708   0.01416  -0.00708  -0.01416
 [715]   0.00708   0.01416   0.00000   0.00000   0.00000   0.00000
 [721]   0.00000   0.00000   0.00000   0.01416   0.00708   0.00000
 [727]   0.00708   0.00000  -0.02124   0.00708   0.01416   0.00000
 [733]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [739]   0.00000   0.00000   0.02124   0.00708   0.00000   0.00000
 [745]   0.00000   0.00000  -0.02124  -0.02124  -0.06372  -0.08496
 [751]  -0.10620  -0.14868  -0.46020  -0.33984  -0.02124   0.09912
 [757]   0.19116   0.15576   0.12744   0.09912   0.07788   0.07788
 [763]   0.05664   0.03540   0.03540   0.02832   0.02832   0.02124
 [769]   0.02124   0.01416   0.02124   0.00708   0.02832   0.00000
 [775]   0.00708   0.02124   0.00000   0.00000   0.00708   0.02124
 [781]   0.00000   0.00000   0.00000   0.02124   0.00708   0.00000
 [787]   0.00000   0.00000   0.00000   0.00708   0.01416   0.00708
 [793]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [799]   0.00000   0.00000   0.00000   0.00708   0.00000   0.02124
 [805]  -0.01416   0.00708   0.00708   0.00000   0.00000   0.00000
 [811]   0.00000   0.00000   0.00000   0.00000   0.00708   0.00000
 [817]  -0.02124  -0.08496  -0.04248   0.00000   0.00000   0.00000
 [823]   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
 [829]   0.01416   0.00000  -0.00708   0.02124  -0.02124  -0.03540
 [835]   0.02832   0.02832   0.00000   0.00708  -0.00708   0.02124
 [841]  -0.01416  -0.00708   0.00000  -0.01416  -0.04956  -0.02124
 [847]  -0.02832  -0.03540  -0.03540  -0.04956  -0.12036  -0.07080
 [853]  -0.14160  -0.09912  -0.01416   0.04956   0.04956   0.06372
 [859]   0.05664   0.00000   0.00708   0.00000   0.00708   0.01416
 [865]   0.00708  -0.00708   0.00000   0.00708   0.00000   0.00000
 [871]   0.00000   0.00708   0.01416   0.02124   0.01416   0.01416
 [877]   0.01416   0.00708   0.02124   0.00000   0.00708  -0.00708
 [883]  -0.04956  -0.03540  -0.47436  -2.93112  -4.42500   1.09032
 [889]   0.65844   0.18408  -1.51512  -5.38788 -10.78992 -15.70344
 [895]  -2.61960   6.15960   6.93840   4.41792   4.63032   3.46920
 [901]   2.68332   1.99656   1.49388   1.43724   2.80368  -0.43896
 [907]   0.39648   0.50976   0.41772   0.29736   0.30444   0.23364
 [913]   0.16992   0.03540   0.11328   0.17700   0.13452   0.16284
 [919]   0.16992   0.07080   0.09204   0.12744   0.07080   0.08496
 [925]   0.09912   0.10620   0.07788   0.07788   0.07080   0.07788
 [931]   0.07788   0.09912   0.07080   0.04248   0.07080   0.08496
 [937]   0.06372   0.05664   0.04956   0.04956   0.04248   0.04956
 [943]   0.04248   0.04956   0.02832   0.04956   0.01416   0.02832
 [949]   0.04248   0.03540  -0.02832  -0.00708   0.01416  -0.04248
 [955]  -0.22656  -0.43188  -0.77880  -0.53100  -0.30444  -0.81420
 [961]  -1.50096  -1.16820  -0.21240  -0.11328   0.22656   0.46020
 [967]   0.49560   0.46728   0.47436   0.41064   0.58764   0.67968
 [973]   0.36108   0.23364   0.15576   0.13452   0.07788   0.12744
 [979]   0.07788   0.12036   0.08496   0.06372   0.07080   0.10620
 [985]   0.02124  -0.00708   0.08496   0.07080   0.03540   0.05664
 [991]   0.02124   0.06372   0.05664   0.04956   0.04248   0.03540
 [997]   0.03540   0.04956   0.02124   0.04248
 [ reached getOption("max.print") -- omitted 25280 entries ]
length(ChangeRF(as.numeric(hilomodified$cms)))
[1] 26280
length(hilomodified$cms) # same length
[1] 26280
hilomodified$changeCMS <- change.vector

head(hilomodified)
# 10-11 negative start of storm
# 11-10 positive end of storm

positive.change <- vector()
negative.change <- vector()
index <- vector()


for(i in 1:length(hilomodified$cms)){
  if (hilomodified$changeCMS[i] < 0 ){
    negative.change[i] <- i
  }else{
    if(hilomodified$changeCMS[i] > 0){
      postive.change[i] <- i
    }
  }
  if(hilomodified$cms[i] >= 10 ){
    index[i] <- i
  }
}
Error: object 'postive.change' not found
LS0tCnRpdGxlOiAiRGF0YSBDbGVhbmluZyAmIERlc2NyaXB0aXZlcyIKYXV0aG9yOiAiQnJpYW5uYSBDaXJpbGxvICYgT2RhbHlzIEJhcnJpZW50b3MiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyBNYXRjaGluZyB0aGUgYm91eSBkYXRhIHRvIHRoZSBvdGhlciBkYXRhIGNvbGxlY3RlZCAKYGBge3J9CmhpbG8gPC0gaGJiX3drdV9oX3h0cwpoaWxvIDwtIGRhdGEuZnJhbWUoZGF0ZT1pbmRleChoaWxvKSwgY29yZWRhdGEoaGlsbykpCmhpbG8gPC0gaGlsb1s1Mjk6NTQ4MTYsXQpoaWxvCiMgd2hpY2goaGlsbyRkYXRlPT0iMjAxMC0xMC0yMyAwMDowMDowMCIpID0gaW5kZXggNTI5IAoKIyB3aGljaChoaWxvJGRhdGU9PSIyMDE2LTEyLTMxIDIzOjAwOjAwIikgPSBpbmRleCA1NDgxNgpgYGAKYGBge3J9Cmxlbmd0aChoaWxvWywxXSkgIyB3ZSBhcmUgbGVmdCB3aXRoIDU0Mjg4IGxpbmVzIG9mIGRhdGEKCjU0ODE2IC0gbGVuZ3RoKGhpbG9bLDFdKSAjIHdlIGxvc3QgNTI4IHZhbHVlcyAKYGBgCgojIENoYW5naW5nIGNvbHVtbiBuYW1lcyAKYGBge3J9CiMgcmVtb3ZpbmcgY29sdW1ucyB0aGF0IHdlIGFyZSBub3QgdXNpbmcgCmhpbG8kZGF0ZS4yIDwtIE5VTEwgIyBhbm90aGVyIGRhdGUgY29sdW1uCmhpbG8kZGF0ZS4xIDwtIE5VTEwgIyBhbm90aGVyIGRhdGUgY29sdW1uCmhpbG8kQkdBUkZVIDwtIE5VTEwgIyA/CmhpbG8kY2ZzIDwtIE5VTEwKaGlsbyRET21nTCA8LSBOVUxMICMgZGlzc29sdmVkIG94eWdlbgojaGlsbyREb3BlciA8LSBOVUxMICMgZGlzc29sdmVkIG94eWdlbgpoaWxvJFBBUjEgPC0gTlVMTCAjID8KaGlsbyRwSCA8LSBOVUxMICMgcEgKaGlsbyROVFUgPC0gTlVMTCAjIGEgZGlmZmVyZW50IG1lYXN1cmVtZW50IGZvciB0dXJiaXRpdHkKaGlsbyRET3BlcjEwIDwtIE5VTEwgIyBkaXNzb2x2ZWQgb3h5Z2VuCgojIGNvbG5hbWVzKGhpbG8pIDwtIGMoIkRhdGUiLCAiY2ZzIiwgIlJpdmVyRmxvdy1jdW1lYyIsICJMb2dSaXZlckZsb3ctY3VtZWMiLCAiQ2hsb3JvcGh5bGwtUkZVIiwgIlNhbGluaXR5LVBQVCIsICJUZW1wLUMiLCAiY2hsb3JvcGh5bGwtY2FsaWJyYXRvciIsICJUdXJiaWRpdHktTlRVIikKIyBkb2VzIG5vdCB3b3JrID8/PwoKaGlsbwpgYGAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgRlVMTCBEQVRBIFNFVCAyMDEyLTIwMTYKIyBEZXNjcmlwdGl2ZXM6IFBMb3RzCgojIyBSaXZlciBGbG93IEZVTEwgREFUQSBTRVQKYGBge3J9Cmxlbmd0aChoaWxvJGxvZ2Ntc1t3aGljaChpcy5uYShoaWxvJGxvZ2Ntcyk9PVRSVUUpXSkgIyAxMiBOQXMgCndoaWNoKGlzLm5hKGhpbG8kbG9nY21zKT09VFJVRSkKClJpdmVyRmxvdyA8LSBnZ3Bsb3QoaGlsbywgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoY21zKSkpICsgCiAgZ2VvbV9saW5lKCkKCnByaW50KFJpdmVyRmxvdyArIGdndGl0bGUoIlJpdmVyIEZsb3ciKStsYWJzKHg9IlRpbWUiLCB5ID0gIlJpdmVyIEZsb3cgLSBjdWJpYyBtZXRlcnMgcGVyIHNlY29uZCIpKQpgYGAKIyMgQ0hMIEZVTEwgREFUQSBTRVQKYGBge3J9Cmxlbmd0aChoaWxvJENobFJGVVt3aGljaChpcy5uYShoaWxvJENobFJGVSk9PVRSVUUpXSkgIyAyMDQ2NCBOQXMKCndoaWNoKGFzLm51bWVyaWMoaGlsbyRDaGxSRlUpPT1tYXgoYXMubnVtZXJpYyhuYS5vbWl0KGhpbG8kQ2hsUkZVKSkpKSAjIDE1LjMgbWF4IAojIENITCB0ZWxscyB1cyB3aGVyZSBpbiB0aGUgZGF0YSBzZXQgdGhpcyBoYXBwZW5lZCAgCmhpbG9bMzg5NzQsXQoKQ0hMIDwtIGdncGxvdChoaWxvLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhDaGxSRlUpKSkgKyAKICBnZW9tX2xpbmUoKQoKcHJpbnQoQ0hMICsgZ2d0aXRsZSgiQ2hsb3JvcGh5bGwgIikrbGFicyh4PSJUaW1lIiwgeSA9ICJDaGxvcm9waHlsbCAgLSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgKFJGVSkiKSkKYGBgCiMjIFR1cmJpdHkgRlVMTCBEQVRBIFNFVApgYGB7cn0KbGVuZ3RoKGhpbG8kQ29yci5OVFVbd2hpY2goaXMubmEoaGlsbyRDb3JyLk5UVSk9PVRSVUUpXSkgIzE1MDEyIE5BcwoKd2hpY2goYXMubnVtZXJpYyhoaWxvJENvcnIuTlRVKT09bWF4KGFzLm51bWVyaWMobmEub21pdChoaWxvJENvcnIuTlRVKSkpKSAjIDg4LjQKIyB0ZWxscyB1cyB3aGVyZSBpbiB0aGUgZGF0YSBzZXQgdGhpcyBoYXBwZW5lZApoaWxvWzMzMjQzLF0KClRVUkIgPC0gZ2dwbG90KGhpbG8sYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpKSArIAogIGdlb21fbGluZSgpCgpwcmludChUVVJCICsgZ2d0aXRsZSgiVHVyYmlkaXR5ICIpK2xhYnMoeD0iVGltZSIsIHkgPSAiVHVyYmlkaXR5IC0gTmVwaGVsb21ldHJpYyBUdXJiaWRpdHkgVW5pdHMgKE5UVSkiKSkKYGBgCiMjIFNhbGluaXR5IEZVTEwgREFUQSBTRVQKYGBge3J9Cmxlbmd0aChoaWxvJHNhbHRwcHRbd2hpY2goaXMubmEoaGlsbyRzYWx0cHB0KT09VFJVRSldKSAjMTEzMzAgTkFzCgpTQUxUIDwtIGdncGxvdChoaWxvLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhzYWx0cHB0KSkpICsgCiAgZ2VvbV9saW5lKCkKCnByaW50KFNBTFQgKyBnZ3RpdGxlKCJTYWxpbml0eSIpK2xhYnMoeD0iVGltZSIsIHkgPSAiU2FsaW5pdHkgLSB1bml0IHBhcnRzIHBlciB0aG91c2FuZCAoUFBUKSIpKQpgYGAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSGlzdG9ncmFtcyBGVUxMIERBVEEgU0VUCiMjIFJpdmVyIEZsb3cgSGlzdG9ncmFtCmBgYHtyfQpoaXN0KGFzLm51bWVyaWMoaGlsbyRsb2djbXMpLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBMb2cgUml2ZXIgRmxvdyIsIHhsYWIgPSAiTG9nIFJpdmVyIEZsb3ciKQoKIyB0aGlzIGxvb2tzIG9rYXkKYGBgCiMjIENITCBIaXN0b2dyYW0KYGBge3J9CiMgVkVSWSBza2V3ZWQKaGlzdChhcy5udW1lcmljKGhpbG8kQ2hsUkZVKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgQ2hsb3JvcGh5bGwiLCB4bGFiID0gIkNobG9yb3BoeWxsICAtIHJlbGF0aXZlIGZsdW9yZXNjZW5jZSB1bml0cyAoUkZVKSIpCgojIHRoaXMgbG9va3MgYmV0dGVyCmhpc3QobG9nKGFzLm51bWVyaWMoaGlsbyRDaGxSRlUpKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTG9nIENobG9yb3BoeWxsIiwgeGxhYiA9ICJDaGxvcm9waHlsbCIpCiMgbm90IHN1cmUgd2hhdCBoYXBwZW5zIHRvIHVuaXRzIHdoZW4gdGFraW5nIHRoZSBsb2cgCmBgYAojIyBUdXJiaXR5IEhpc3RvZ3JhbQpgYGB7cn0KIyBWRVJZIHNrZXdlZApoaXN0KGFzLm51bWVyaWMoaGlsbyRDb3JyLk5UVSksIG1haW4gPSAiSGlzdG9ncmFtIG9mIFR1cmJpZGl0eSIsIHhsYWIgPSAiVHVyYmlkaXR5IC0gTmVwaGVsb21ldHJpYyBUdXJiaWRpdHkgVW5pdHMgKE5UVSkiKQoKIyB0aGlzIGxvb2tzIGJldHRlcgpoaXN0KGxvZyhhcy5udW1lcmljKGhpbG8kQ29yci5OVFUpKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTG9nIFR1cmJpZGl0eSIsIHhsYWIgPSAiVHVyYmlkaXR5IikKIyBub3Qgc3VyZSB3aGF0IGhhcHBlbnMgdG8gdW5pdHMgd2hlbiB0YWtpbmcgdGhlIGxvZyAKYGBgCiMjIFNhbGluaXR5IEhpc3RvZ3JhbQpgYGB7cn0KIyBza2V3ZWQKaGlzdChhcy5udW1lcmljKGhpbG8kc2FsdHBwdCksIG1haW4gPSAiSGlzdG9ncmFtIG9mIFNhbGluaXR5IiwgeGxhYiA9ICJTYWxpbml0eSAtIHVuaXQgcGFydHMgcGVyIHRob3VzYW5kIChQUFQpIikKCiMgdGhpcyBpcyB3b3JzdCEKaGlzdChsb2coYXMubnVtZXJpYyhoaWxvJHNhbHRwcHQpKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTG9nIFNhbGluaXR5IiwgeGxhYiA9ICJTYWxpbml0eSIpCiMgbm90IHN1cmUgd2hhdCBoYXBwZW5zIHRvIHVuaXRzIHdoZW4gdGFraW5nIHRoZSBsb2cgCmBgYAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTkVXIERBVEEgU0VULU1vZGlmaWVkIERhdGEgMjAxMy0yMDE1CmBgYHtyfQojIHN0YXJ0IGRhdGU6IDIwMTMtMDEtMDEgMDA6MDA6MDAKIyBlbmQgZGF0ZTogMjAxNS0xMi0zMSAyMzowMDowMApoaWxvbW9kaWZpZWQgPC0gaGlsb1sxOTIyNTo0NTUwNCxdCmxlbmd0aChoaWxvWywxXSktbGVuZ3RoKGhpbG9tb2RpZmllZFssMV0pCiMgbG9zdCAyODAwOCBlbnRyaWVzIG9mIGRhdGEgCgpsZW5ndGgoaGlsb21vZGlmaWVkWywxXSktNTI4ICMgd2UgYXJlIGxlZnQgd2l0aCAyNTc1MiBlbnRyaWVzIG9mIGRhdGEgCgoKaGVhZChoaWxvbW9kaWZpZWQpCnRhaWwoaGlsb21vZGlmaWVkKQoKYGBgCgojIERlc2NyaXB0aXZlcyBvbiBhbGwgdmFyaWFibGVzIE1PRElGSUVEIERBVEEgU0VUOiBVc2luZyBGYXZzdGF0cwojIyBSaXZlciBGbG93IEZhdnN0YXRzCmBgYHtyfQpsaWJyYXJ5KG1vc2FpYykKZmF2c3RhdHMoaGlsb21vZGlmaWVkJGNtcykKYGBgCiMjIENITCBGYXZzdGF0cwpgYGB7cn0KZmF2c3RhdHMoaGlsb21vZGlmaWVkJENobFJGVSkKYGBgCiMjIFR1cmJpdGl0eSBGYXZzdGF0cwpgYGB7cn0KZmF2c3RhdHMoaGlsb21vZGlmaWVkJENvcnIuTlRVKQpgYGAKIyMgU2FsaW5pdHkgRmF2c3RhdHMKYGBge3J9CmZhdnN0YXRzKGhpbG9tb2RpZmllZCRzYWx0cHB0KQpmYXZzdGF0cyhoaWxvbW9kaWZpZWQkVGVtcEMpCmZhdnN0YXRzKGhpbG9tb2RpZmllZCREb3BlcikKYGBgCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1PRElGSUVEIERBVEEgU0VUIDIwMTMtMjAxNQojIERlc2NyaXB0aXZlczogUGxvdHMKCiMjIFJpdmVyIEZsb3cgTU9ESUZJRUQKYGBge3J9Cmxlbmd0aChoaWxvbW9kaWZpZWQkbG9nY21zW3doaWNoKGlzLm5hKGhpbG9tb2RpZmllZCRsb2djbXMpPT1UUlVFKV0pICMgTm8gTkFzLCBZQVkhCndoaWNoKGlzLm5hKGhpbG9tb2RpZmllZCRsb2djbXMpPT1UUlVFKQoKUml2ZXJGbG93TW9kIDwtIGdncGxvdChoaWxvbW9kaWZpZWQsICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKGNtcykpKSArIAogIGdlb21fbGluZSgpCgpwcmludChSaXZlckZsb3dNb2QgKyBnZ3RpdGxlKCJSaXZlciBGbG93IikrbGFicyh4PSJUaW1lIiwgeSA9ICJSaXZlciBGbG93IC0gY3ViaWMgbWV0ZXJzIHBlciBzZWNvbmQiKSkKYGBgCiMjIENITCBNT0RJRklFRApgYGB7cn0Kc3VtKGlzLm5hKGhpbG9tb2RpZmllZCRDaGxSRlUpPT1UUlVFKSAjIDE4ODQgTkFzCiN3aGljaChpcy5uYShoaWxvbW9kaWZpZWQkQ2hsUkZVKT09VFJVRSkKIyBtYXgoYXMubnVtZXJpYyhuYS5vbWl0KGhpbG8kQ2hsUkZVKSkpICMgMTUuMwp3aGljaChhcy5udW1lcmljKGhpbG9tb2RpZmllZCRDaGxSRlUpPT0xNS4zKQpoaWxvWzM4OTc0LF0KCkNITE1vZCA8LSBnZ3Bsb3QoaGlsb21vZGlmaWVkLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhDaGxSRlUpKSkgKyAKICBnZW9tX2xpbmUoKQoKcHJpbnQoQ0hMTW9kICsgZ2d0aXRsZSgiQ2hsb3JvcGh5bGwgIikrbGFicyh4PSJUaW1lIiwgeSA9ICJDaGxvcm9waHlsbCAgLSByZWxhdGl2ZSBmbHVvcmVzY2VuY2UgdW5pdHMgKFJGVSkiKSkKYGBgCgoKIyBUdXJiaXRpdHkgTU9ESUZJRUQKYGBge3J9Cmxlbmd0aChoaWxvbW9kaWZpZWQkQ29yci5OVFVbd2hpY2goaXMubmEoaGlsb21vZGlmaWVkJENvcnIuTlRVKT09VFJVRSldKSAjIDI3MDQgTkFzCiMgbWF4KGFzLm51bWVyaWMobmEub21pdChoaWxvJENvcnIuTlRVKSkpICMgODguNAp3aGljaChhcy5udW1lcmljKGhpbG8kQ29yci5OVFUpPT04OC40KQpoaWxvWzMzMjQzLF0KClRVUkJNb2QgPC0gZ2dwbG90KGhpbG9tb2RpZmllZCwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoQ29yci5OVFUpKSkgKyAKICBnZW9tX2xpbmUoKQoKcHJpbnQoVFVSQk1vZCArIGdndGl0bGUoIlR1cmJpZGl0eSAiKStsYWJzKHg9IlRpbWUiLCB5ID0gIlR1cmJpZGl0eSAtIE5lcGhlbG9tZXRyaWMgVHVyYmlkaXR5IFVuaXRzIChOVFUpIikpCmBgYAoKIyBTYWxpbml0eSBNT0RJRklFRApgYGB7cn0KbGVuZ3RoKGhpbG9tb2RpZmllZCRzYWx0cHB0W3doaWNoKGlzLm5hKGhpbG9tb2RpZmllZCRzYWx0cHB0KT09VFJVRSldKSAjIDIyNjcgTkFzCgpTQUxUTW9kIDwtIGdncGxvdChoaWxvbW9kaWZpZWQsICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKHNhbHRwcHQpKSkgKyAKICBnZW9tX2xpbmUoKQoKcHJpbnQoU0FMVE1vZCArIGdndGl0bGUoIlNhbGluaXR5IikrbGFicyh4PSJUaW1lIiwgeSA9ICJTYWxpbml0eSAtIHVuaXQgcGFydHMgcGVyIHRob3VzYW5kIChQUFQpIikpCmBgYAojIFRlbXB1cmF0dXJlIE1PRElGSUVECmBgYHtyfQpsZW5ndGgoaGlsb21vZGlmaWVkJFRlbXBDW3doaWNoKGlzLm5hKGhpbG9tb2RpZmllZCRUZW1wQyk9PVRSVUUpXSkgIyAyMjY3IE5BcwoKVGVtcE1vZCA8LSBnZ3Bsb3QoaGlsb21vZGlmaWVkLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhUZW1wQykpKSArIAogIGdlb21fbGluZSgpCgpwcmludChUZW1wTW9kICsgZ2d0aXRsZSgiVGVtcGVyYXR1cmUiKStsYWJzKHg9IlRpbWUiLCB5ID0gIlRlbXBlcmF0dXJlIC0gQ2Vsc2l1cyIpKQpgYGAKIyBEaXNzb2x2ZWQgT3h5Z2VuIE1PRElGSUVECmBgYHtyfQpsZW5ndGgoaGlsb21vZGlmaWVkJERvcGVyW3doaWNoKGlzLm5hKGhpbG9tb2RpZmllZCREb3Blcik9PVRSVUUpXSkgIyAyMjY3IE5BcwoKVGVtcE1vZCA8LSBnZ3Bsb3QoaGlsb21vZGlmaWVkLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhEb3BlcikpKSArIAogIGdlb21fbGluZSgpCgpwcmludChUZW1wTW9kICsgZ2d0aXRsZSgiRGlzc29sdmVkIE94eWdlbiIpK2xhYnMoeD0iVGltZSIsIHkgPSAiRGlzc29sdmVkIE94eWdlbiBpbiBwZXJjZW50IG9mIHNhdHVyYXRpb24iKSkKYGBgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEhpc3RvZ3JhbXMgTU9ESUZJRUQgCgojIyBSaXZlciBGbG93IE1PRElGSUVECmBgYHtyfQpoaXN0KGFzLm51bWVyaWMoaGlsb21vZGlmaWVkJGNtcyksIG1haW4gPSAiSGlzdG9ncmFtIG9mIExvZyBSaXZlciBGbG93IiwgeGxhYiA9ICJMb2cgUml2ZXIgRmxvdyIsIGJyZWFrcyA9OTAsIHhsaW0gPSBjKDAsMTAwKSkKCiMgdGhpcyBsb29rcyBva2F5CmBgYAojIyBDSEwgTU9ESUZJRUQKYGBge3J9CiMgVkVSWSBza2V3ZWQKaGlzdChhcy5udW1lcmljKGhpbG9tb2RpZmllZCRDaGxSRlUpLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBDaGxvcm9waHlsbCIsIHhsYWIgPSAiQ2hsb3JvcGh5bGwgIC0gcmVsYXRpdmUgZmx1b3Jlc2NlbmNlIHVuaXRzIChSRlUpIikKCiMgdGhpcyBsb29rcyBiZXR0ZXIKaGlzdChsb2coYXMubnVtZXJpYyhoaWxvbW9kaWZpZWQkQ2hsUkZVKSksIG1haW4gPSAiSGlzdG9ncmFtIG9mIExvZyBDaGxvcm9waHlsbCIsIHhsYWIgPSAiQ2hsb3JvcGh5bGwiKQojIG5vdCBzdXJlIHdoYXQgaGFwcGVucyB0byB1bml0cyB3aGVuIHRha2luZyB0aGUgbG9nIApgYGAKIyMgVHVyYml0aXR5IE1PRElGSUVECmBgYHtyfQojIFZFUlkgc2tld2VkCmhpc3QoYXMubnVtZXJpYyhoaWxvbW9kaWZpZWQkQ29yci5OVFUpLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBUdXJiaWRpdHkiLCB4bGFiID0gIlR1cmJpZGl0eSAtIE5lcGhlbG9tZXRyaWMgVHVyYmlkaXR5IFVuaXRzIChOVFUpIikKCiMgdGhpcyBsb29rcyBiZXR0ZXIKaGlzdChsb2coYXMubnVtZXJpYyhoaWxvbW9kaWZpZWQkQ29yci5OVFUpKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTG9nIFR1cmJpZGl0eSIsIHhsYWIgPSAiVHVyYmlkaXR5IikKIyBub3Qgc3VyZSB3aGF0IGhhcHBlbnMgdG8gdW5pdHMgd2hlbiB0YWtpbmcgdGhlIGxvZyAKYGBgCiMjIFNhbGluaXR5IE1PRElGSUVECmBgYHtyfQojIHNrZXdlZApoaXN0KGFzLm51bWVyaWMoaGlsb21vZGlmaWVkJHNhbHRwcHQpLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBTYWxpbml0eSIsIHhsYWIgPSAiU2FsaW5pdHkgLSB1bml0IHBhcnRzIHBlciB0aG91c2FuZCAoUFBUKSIpCgojIHRoaXMgaXMgd29yc3QhCmhpc3QobG9nKGFzLm51bWVyaWMoaGlsb21vZGlmaWVkJHNhbHRwcHQpKSwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTG9nIFNhbGluaXR5IiwgeGxhYiA9ICJTYWxpbml0eSIpCiMgbm90IHN1cmUgd2hhdCBoYXBwZW5zIHRvIHVuaXRzIHdoZW4gdGFraW5nIHRoZSBsb2cgCmBgYAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIFBsb3Qgd2l0aCBBTEwgVmFyIDIwMTMtMjAxNQpJdCBpcyBoYXJkIHRvIHNlZSB3aGF0IGlzIGdvaW5nIG9uIApgYGB7cn0KQWxsWWVhcnMgPC0gZ2dwbG90KGhpbG9tb2RpZmllZCwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMobG9nY21zKSkpICsgCiAgZ2VvbV9saW5lKCkrCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhzYWx0cHB0KSksIGNvbG9yID0gImRhcmtyZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZGFya2dyZWVuIikgKwogIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJibHVlIikKCnByaW50KEFsbFllYXJzICsgZ2d0aXRsZSgiSGlsbyBCYXkiKStsYWJzKHg9IlRpbWUiLCB5ID0gIlJpdmVyIEZsb3cgLSBjdWJpYyBtZXRlcnMgcGVyIHNlY29uZCIpKQoKYGBgCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBEZXNjcmlwdGl2ZXMgYnkgU3Rvcm0KV2UgYXJlIHBpY2tpbmcgb25lIHN0b3JtIGZyb20gZWFjaCB5ZWFyLiBXZSBjYW4gaW5kaWNhdGUgYSBzdG9ybSBoYXMgb2NjdXJyZWQgYnkgdGhlIGV4dHJlbWUgZXZlbnRzIGluIHRoZSByaXZlciBmbG93IGRhdGEuIApXZSB3aWxsIG5vdCB1c2UgdGhlIGxvZyAod2hpY2ggaXMgbG9nYmFzZTEwKSBpbiBvcmRlciB0byBzZWUgdGhlIGV4dHJlbWUgZXZlbnRzCldoZW4gc2FsaW5pdHkgaXMgYmVsb3cgMzUgdGhpcyBhbHNvIGluZGljYXRlcyBhIHN0b3JtIGhhcyBvY2N1cnJlZC4gCgpXZSB3aWxsIGJyZWFrIHRoZSBkYXRhIHNldCBieSB5ZWFyIHRvIGZpbmQgdGhlIG1vc3QgZXh0cmVtZSBldmVudCBmb3IgZWFjaCB5ZWFyLiAKYGBge3J9CmhpbG8yMDEzIDwtIGhpbG9tb2RpZmllZFsxOjg3NjAsXQoKaGlsbzIwMTQgPC0gaGlsb21vZGlmaWVkWzg3NjE6MTc1MjAsXQoKaGlsbzIwMTUgPC0gaGlsb21vZGlmaWVkWzE3NTIxOmxlbmd0aChoaWxvbW9kaWZpZWRbLDFdKSxdCmBgYAoKIyAyMDEzIERhdGEgJiBQbG90CmBgYHtyfQojIG1heChhcy5udW1lcmljKGhpbG8yMDEzJGxvZ2NtcykpICMgdGhpcyBpcyBsb2cgYmFzZSAxMCAKIyBUaGlzIGlzIE5PVCB0aGUgbmF0dXJhbCBsb2cKbWF4KGFzLm51bWVyaWMoaGlsbzIwMTMkY21zKSkgIyAyMDcuMTg2IAp3aGljaChhcy5udW1lcmljKGhpbG8yMDEzJGNtcykgPT0gbWF4KGFzLm51bWVyaWMoaGlsbzIwMTMkY21zKSkpCgpoaWxvMjAxM1szNTUwLF0KIyBhbGwgdmFsdWVzIGZvciB0aGlzIHN0b3JtIGFyZSBOQQoKcGxvdDIwMTMgPC0gZ2dwbG90KGhpbG8yMDEzLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhjbXMpKSkgKyAKICBnZW9tX2xpbmUoY29sb3I9ImJsYWNrIikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhzYWx0cHB0KSksIGNvbG9yID0gImRhcmtyZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZGFya2dyZWVuIikgKwogIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJibHVlIikKCnByaW50KHBsb3QyMDEzICsgZ2d0aXRsZSgiMjAxMyIpK2xhYnMoeD0iVGltZSIsIHkgPSAiUml2ZXIgRmxvdyAtIGN1YmljIG1ldGVycyBwZXIgc2Vjb25kIikpCmBgYAoKIyMjIyBTcGxpdCAyMDEzIGludG8gNiBtb250aHMgdG8gZ2V0IGEgYmV0dGVyIHZpc3VhbApgYGB7cn0KIyBSMjAxMy4xIDwtIGdncGxvdChoaWxvMjAxM1sxOihsZW5ndGgoaGlsbzIwMTNbLDFdKS8yKSxdLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhjbXMpKSkgKyAKIyAgIGdlb21fbGluZShjb2xvcj0iYmxhY2siKSsKIyAgIGdlb21fbGluZShhZXMoeSA9IGFzLm51bWVyaWMoc2FsdHBwdCkpLCBjb2xvciA9ICJkYXJrcmVkIikgKwojICAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZGFya2dyZWVuIikgKwojICAgZ2VvbV9saW5lKGFlcyh5PWFzLm51bWVyaWMoQ2hsUkZVKSksY29sb3I9ImJsdWUiKQojIHByaW50KFIyMDEzLjEgKyBnZ3RpdGxlKCJSaXZlciBGbG93IikrbGFicyh4PSJUaW1lIiwgeSA9ICJSaXZlciBGbG93IC0gY3ViaWMgbWV0ZXJzIHBlciBzZWNvbmQiKSkKIyBSMjAxMy4xK3lsaW0oMCw0MCkKIyAKIyAKIyBSMjAxMy4yIDwtIGdncGxvdChoaWxvMjAxM1sobGVuZ3RoKGhpbG8yMDEzWywxXSkvMik6bGVuZ3RoKGhpbG8yMDEzWywxXSksXSwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoY21zKSkpICsgCiMgICBnZW9tX2xpbmUoY29sb3I9ImJsYWNrIikrCiMgICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKHNhbHRwcHQpKSwgY29sb3IgPSAiZGFya3JlZCIpICsKIyAgIGdlb21fbGluZShhZXMoeSA9IGFzLm51bWVyaWMoQ29yci5OVFUpKSwgY29sb3I9ImRhcmtncmVlbiIpICsKIyAgIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJibHVlIikKIyBwcmludChSMjAxMy4yICsgZ2d0aXRsZSgiUml2ZXIgRmxvdyIpK2xhYnMoeD0iVGltZSIsIHkgPSAiUml2ZXIgRmxvdyAtIGN1YmljIG1ldGVycyBwZXIgc2Vjb25kIikpCiMgUjIwMTMuMit5bGltKDAsNDApCmBgYAoKIyAyMDE0IERhdGEgJiBQbG90CmBgYHtyfQojIE1heCByaXZlciBmbG93IGluIHRoZSBvdmVyYWxsIGRhdGEgc2V0Cm1heChhcy5udW1lcmljKGhpbG8yMDE0JGNtcykpCm1heChhcy5udW1lcmljKGhpbG9tb2RpZmllZCRjbXMpKQoKd2hpY2goYXMubnVtZXJpYyhoaWxvMjAxNCRjbXMpID09IG1heChhcy5udW1lcmljKGhpbG8yMDE0JGNtcykpKQoKaGlsbzIwMTRbNTI2MyxdCgpSMjAxNCA8LSBnZ3Bsb3QoaGlsbzIwMTQsICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKGxvZ2NtcykpKSArIAogIGdlb21fbGluZShjb2xvcj0iYmxhY2siKSsKICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKHNhbHRwcHQpKSwgY29sb3IgPSAiZGFya3JlZCIpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKENvcnIuTlRVKSksIGNvbG9yPSJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9saW5lKGFlcyh5PWFzLm51bWVyaWMoQ2hsUkZVKSksY29sb3I9ImJsdWUiKQoKcHJpbnQoUjIwMTQgKyBnZ3RpdGxlKCIyMDE0IikrbGFicyh4PSJUaW1lIiwgeSA9ICJSaXZlciBGbG93IC0gY3ViaWMgbWV0ZXJzIHBlciBzZWNvbmQiKSkKYGBgCgoKIyAyMDE1IERhdGEgJiBQbG90CmBgYHtyfQptYXgoYXMubnVtZXJpYyhoaWxvMjAxNSRjbXMpKQoKd2hpY2goYXMubnVtZXJpYyhoaWxvMjAxNSRjbXMpID09IG1heChhcy5udW1lcmljKGhpbG8yMDE1JGNtcykpKQoKaGlsbzIwMTVbNjQ3NSxdCgpSMjAxNSA8LSBnZ3Bsb3QoaGlsbzIwMTUsICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKGxvZ2NtcykpKSArIAogIGdlb21fbGluZShjb2xvcj0iYmxhY2siKSsKICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKHNhbHRwcHQpKSwgY29sb3IgPSAiZGFya3JlZCIpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKENvcnIuTlRVKSksIGNvbG9yPSJkYXJrZ3JlZW4iKSArCiAgZ2VvbV9saW5lKGFlcyh5PWFzLm51bWVyaWMoQ2hsUkZVKSksY29sb3I9ImJsdWUiKQoKcHJpbnQoUjIwMTUgKyBnZ3RpdGxlKCIyMDE1IikrbGFicyh4PSJUaW1lIiwgeSA9ICJSaXZlciBGbG93IC0gY3ViaWMgbWV0ZXJzIHBlciBzZWNvbmQiKSkKYGBgCgoKIyBTZXBhcmF0aW5nIHRoZSBEYXRhIGJ5IFN0b3JtIEV2ZW50cwo9PT09PT09CiMgU2VwYXJhdGluZyB0aGUgRGF0YSBieSBTdG9ybQoKYGBge3J9Cm91dGNvbWVzIDwtIGFzLm51bWVyaWMoaGlsb21vZGlmaWVkJHNhbHRwcHQpPDI1IAppbmRleC5sdDI1IDwtIHdoaWNoKG91dGNvbWVzPT1UUlVFKQoKcG9zcy5zdG9ybXMgPC0gaGlsb21vZGlmaWVkW2luZGV4Lmx0MjUsXQpwb3NzLnN0b3JtcwpgYGAKCgpgYGB7cn0Kb3V0Y29tZXMuMzUgPC0gYXMubnVtZXJpYyhoaWxvbW9kaWZpZWQkc2FsdHBwdCk8MzUgCmluZGV4Lmx0MzUgPC0gd2hpY2gob3V0Y29tZXM9PVRSVUUpCmluZGV4Lmx0MjUKcG9zcy5zdG9ybXMzNSA8LSBoaWxvbW9kaWZpZWRbaW5kZXgubHQyNSxdCnBvc3Muc3Rvcm1zMzUKCmhpbG9tb2RpZmllZCRkYXRlWzE2XQpgYGAKCmBgYHtyfQpzdG9ybS4xLjcuMTMgPC0gZ2dwbG90KGhpbG9tb2RpZmllZFsxNDU6MTY4LF0sICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKGNtcykpKSArIAogIGdlb21fbGluZShjb2xvcj0iYmxhY2siKSsKICBnZW9tX2xpbmUoYWVzKHkgPSBhcy5udW1lcmljKHNhbHRwcHQpKSwgY29sb3IgPSAibGlnaHRzdGVlbGJsdWUxIikgKwogIGdlb21fbGluZShhZXMoeSA9IGFzLm51bWVyaWMoQ29yci5OVFUpKSwgY29sb3I9ImdyZXk2OSIpICsKICBnZW9tX2xpbmUoYWVzKHk9YXMubnVtZXJpYyhDaGxSRlUpKSxjb2xvcj0ia2hha2kiKQoKcHJpbnQoc3Rvcm0uMS43LjEzICsgZ2d0aXRsZSgiU3Rvcm0gMS83LzEzIikrbGFicyh4PSJUaW1lIikpCmBgYAoKIyBUcnlpbmcgdG8gbWFrZSB0aGUgUmFpbmZhbGwgcGxvdCBlYXNpZXIgdG8gcmVhZAoKYGBge3J9ClJpdmVyRmxvdzEgPC0gZ2dwbG90KGhpbG9tb2RpZmllZFsxOjEwMCxdLCAgYWVzKHggPSBkYXRlLCB5ID0gYXMubnVtZXJpYyhjbXMpKSkgKyAKICBnZW9tX2xpbmUoKQoKcHJpbnQoUml2ZXJGbG93ICsgZ2d0aXRsZSgiUml2ZXIgRmxvdyIpK2xhYnMoeD0iVGltZSIsIHkgPSAiUml2ZXIgRmxvdyAtIGN1YmljIG1ldGVycyBwZXIgc2Vjb25kIikpCmBgYAo9PT09PT09CmBgYHtyfQpnZXR3ZCgpCiMgd3JpdGUuY3N2KGhpbG9tb2RpZmllZCxmaWxlPSJIaWxvQmF5TkVXMTN0bzE1LmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgojIE5FVyBDaGFuZ2UgaW4gUml2ZXIgRmxvdyBDb2x1bW4gCgpgYGB7cn0KIyBhbnkgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIGNtcyBpbmRpY2F0ZXMgYSBzdG9ybQpwb3MubmVnIDwtIGFzLm51bWVyaWMoaGlsb21vZGlmaWVkJGNtcykgLSAxMCAKCnN0YXJ0IDwtIHZlY3RvcigpCmVuZCA8LSB2ZWN0b3IoKQoKZm9yKGkgaW4gMTpsZW5ndGgocG9zLm5lZykpewogIGlmKGlzVFJVRShwb3MubmVnW2ldIDwgMCAmJiBwb3MubmVnW2krMV0gPiAwKSl7IAogICAgIyBpZiBnb2VzIGZyb20gKyB0byAtIHRoZW4gdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3Rvcm0KICAgIHN0YXJ0W2ldIDwtIGkKICB9ZWxzZSBpZihpc1RSVUUocG9zLm5lZ1tpXSA+IDAgJiYgcG9zLm5lZ1tpKzFdIDwgMCkpewogICAgIyBpZiBnb2VzIGZyb20gLSB0byArIHRoZW4gdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBzdG9ybQogICAgZW5kW2ldIDwtIGkKICAgIH0KfQpzdGFydDwtc3RhcnRbIWlzLm5hKHN0YXJ0KV0gIyByZW1vdmluZyBOQQpzdGFydApsZW5ndGgoc3RhcnQpICMgbWFrZSBzdXJlIGJvdGggc3RhcnQgYW5kIGVuZCBhcmUgdGhlIHNhbWUgbGVuZ3RoIAoKZW5kPC1lbmRbIWlzLm5hKGVuZCldCmVuZApsZW5ndGgoZW5kKQpgYGAKCgpgYGB7cn0KZm9yKGkgaW4gMTpsZW5ndGgoc3RhcnQpKXsKICBzdG9ybSA8LSBnZ3Bsb3QoaGlsb21vZGlmaWVkWyhzdGFydFtpXS0yNCk6KGVuZFtpXSsyNCksXSwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoY21zKSkpICsKICBnZW9tX2xpbmUoY29sb3I9ImJsYWNrIikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZ3JleTY5IikgKwogIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJraGFraSIpCgpwcmludChzdG9ybSArIGdndGl0bGUoIlN0b3JtIDEvNy8xMyIpK2xhYnMoeD0iVGltZSIpKQp9CgpgYGAKCmBgYHtyfQpDaGFuZ2VSRiA8LSBmdW5jdGlvbih4ID0gdmVjdG9yKCkpewpjaGFuZ2UgPC0gYygwKQogIGZvcihpIGluIDE6KGxlbmd0aCh4KS0xKSl7CiAgICBjaGFuZ2VbaSsxXSA8LSB4W2ldLXhbaSsxXQogIH0KICByZXR1cm4oY2hhbmdlKQp9CmNoYW5nZS52ZWN0b3IgPC0gYyhDaGFuZ2VSRihhcy5udW1lcmljKGhpbG9tb2RpZmllZCRjbXMpKSkKY2hhbmdlLnZlY3RvcgpsZW5ndGgoQ2hhbmdlUkYoYXMubnVtZXJpYyhoaWxvbW9kaWZpZWQkY21zKSkpCmxlbmd0aChoaWxvbW9kaWZpZWQkY21zKSAjIHNhbWUgbGVuZ3RoCgpoaWxvbW9kaWZpZWQkY2hhbmdlQ01TIDwtIGNoYW5nZS52ZWN0b3IKCmhlYWQoaGlsb21vZGlmaWVkKQpgYGAKCmBgYHtyfQojIDEwLTExIG5lZ2F0aXZlIHN0YXJ0IG9mIHN0b3JtCiMgMTEtMTAgcG9zaXRpdmUgZW5kIG9mIHN0b3JtCgpwb3NpdGl2ZS5jaGFuZ2UgPC0gdmVjdG9yKCkKbmVnYXRpdmUuY2hhbmdlIDwtIHZlY3RvcigpCmluZGV4IDwtIHZlY3RvcigpCgoKZm9yKGkgaW4gMTpsZW5ndGgoaGlsb21vZGlmaWVkJGNtcykpewogIGlmIChoaWxvbW9kaWZpZWQkY2hhbmdlQ01TW2ldIDwgMCApewogICAgbmVnYXRpdmUuY2hhbmdlW2ldIDwtIGkKICB9ZWxzZXsKICAgIGlmKGhpbG9tb2RpZmllZCRjaGFuZ2VDTVNbaV0gPiAwKXsKICAgICAgcG9zdGl2ZS5jaGFuZ2VbaV0gPC0gaQogICAgfQogIH0KICBpZihoaWxvbW9kaWZpZWQkY21zW2ldID49IDEwICl7CiAgICBpbmRleFtpXSA8LSBpCiAgfQp9CmluZGV4CnBvc2l0aXZlLmNoYW5nZQpuZWdhdGl2ZS5jaGFuZ2UKbGVuZ3RoKHdoaWNoKGluZGV4ID4gMCkpIAoKc3Rvcm1zIDwtIHNvcnQoYyhwb3NpdGl2ZS5jaGFuZ2UsbmVnYXRpdmUuY2hhbmdlKSwgZGVjcmVhc2luZyA9IEZBTFNFKQpzdG9ybXMKaGlsb3N0b3JtcyA8LSBoaWxvbW9kaWZpZWRbc3Rvcm1zLF0KaGlsb3N0b3JtcwpgYGAKCmBgYHtyfQpzdG9ybSA8LSBnZ3Bsb3QoaGlsb3N0b3Jtc1s1MDoyNTAsXSwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoY21zKSkpICsKICBnZW9tX2xpbmUoY29sb3I9ImJsYWNrIikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZ3JleTY5IikgKwogIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJraGFraSIpCgpwcmludChzdG9ybSArIGdndGl0bGUoIlN0b3JtIDEvNy8xMyIpK2xhYnMoeD0iVGltZSIpKQpgYGAKCmBgYHtyfQoKdmVjdG9yIDwtIHZlY3RvcigpCmZvcihpIGluIDE6bGVuZ3RoKHN0b3JtcykpewogIGlmKGlzVFJVRShhYnMoc3Rvcm1zW2ldLXN0b3Jtc1tpKzFdKSA+IDEwKSl7CiAgICBzdG9wIDwtIHN0b3Jtc1tpXQogIH1lbHNlewogICAgc3RvcCA8LSAwCiAgfQogIGlmKHN0b3AgPiAwKXsKICAgIHZlY3RvcltpXSA8LSBzdG9wCiAgfQp9CnZlY3Rvclt3aGljaChpcy5uYSh2ZWN0b3IpPT1GQUxTRSldCgpzdG9ybS4xLjcuMTMgPC0gZ2dwbG90KGhpbG9tb2RpZmllZFsxOjgwLF0sICBhZXMoeCA9IGRhdGUsIHkgPSBhcy5udW1lcmljKGNtcykpKSArCiAgZ2VvbV9saW5lKGNvbG9yPSJibGFjayIpKwogIGdlb21fbGluZShhZXMoeSA9IGFzLm51bWVyaWMoc2FsdHBwdCkpLCBjb2xvciA9ICJsaWdodHN0ZWVsYmx1ZTEiKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYXMubnVtZXJpYyhDb3JyLk5UVSkpLCBjb2xvcj0iZ3JleTY5IikgKwogIGdlb21fbGluZShhZXMoeT1hcy5udW1lcmljKENobFJGVSkpLGNvbG9yPSJraGFraSIpCgpwcmludChzdG9ybS4xLjcuMTMgKyBnZ3RpdGxlKCJTdG9ybSAxLzcvMTMiKStsYWJzKHg9IlRpbWUiKSkKYGBgCgpgYGB7cn0Kc3RhcnRheGlzIDwtIHZlY3RvcigpCmVuZGF4aXMgPC0gdmVjdG9yKCkKaSA8LSAxCndoaWxlIChpIDw9IGxlbmd0aChjaGFuZ2UudmVjdG9yKSkgewogIGlmKGlzVFJVRShjaGFuZ2UudmVjdG9yW2ldIDwgMCkpewogICAgc3RhcnRheGlzW2ldIDwtIFJpdmVyRmxvd1tpXQogIH0KICBpIDwtIGkrMQp9CmJlZ2luPC13aGljaChpcy5uYShzdGFydGF4aXMpID09IEZBTFNFKQpiZWdpbgoKd2hpbGUgKGkgPD0gbGVuZ3RoKGNoYW5nZS52ZWN0b3IpKSB7CiAgaWYoaXNUUlVFKGNoYW5nZS52ZWN0b3JbaV0gPiAwKSl7CiAgICBlbmRheGlzW2ldIDwtIFJpdmVyRmxvd1tpXQogIH0KICBpIDwtIGkrMQp9CmVuZCA8LSB3aGljaChpcy5uYShlbmRheGlzKT09RkFMU0UpCgoKc3Rvcm0uMS43LjEzIDwtIGdncGxvdChoaWxvbW9kaWZpZWRbYmVnaW4sXSwgIGFlcyh4ID0gZGF0ZSwgeSA9IGFzLm51bWVyaWMoY21zKSkpICsgCiAgZ2VvbV9saW5lKGNvbG9yPSJibGFjayIpKwogIGdlb21fbGluZShhZXMoeSA9IGFzLm51bWVyaWMoQ29yci5OVFUpKSwgY29sb3I9ImdyZXk2OSIpICsKICBnZW9tX2xpbmUoYWVzKHk9YXMubnVtZXJpYyhDaGxSRlUpKSxjb2xvcj0ia2hha2kiKQoKcHJpbnQoc3Rvcm0uMS43LjEzICsgZ2d0aXRsZSgiU3Rvcm0gMS83LzEzIikrbGFicyh4PSJUaW1lIikpCgpgYGAKCmBgYHtyfQp3aGlsZSAoaSA8PSBsZW5ndGgoY2hhbmdlLnZlY3RvcikpIHsKICBpZihpc1RSVUUoY2hhbmdlLnZlY3RvcltpXSA8IDApKXsKICAgIHN0YXJ0YXhpc1tpXSA8LSBSaXZlckZsb3dbaV0KICAgIGkgPC0gaSsxCiAgfWVsc2V7CiAgICBpZihpc1RSVUUoY2hhbmdlLnZlY3RvcltpXSA+IDApKXsKICAgICAgZW5kYXhpc1tpXSA8LSBSaXZlckZsb3dbaV0KICAgIH0KICB9Cn0KYGBgCgo=